Agenda

 

Welcome!

OBJETIVO: Presentación y breve panorama de lo que haremos las próximas semanas

 

Funcionamiento de nuestro cerebro.

 

Clear your minds!!!

Clear your minds!!!

 

Hay que ubicarnos en donde estamos en base a lo que hacemos actualmente. No todo lo que hacemos hoy esta mal, pero hay aún mas cosas que aprender.

 

Dónde estamos?

Dónde estamos?

 

La generación e ingesta de datos hoy es una necesidad, debemos contar con mejores herramientas para el manejo de los mismos. Es muy util en nuestras vidas se consumidores, pero mucho mejor ser generadores y controladores de ellos.

 

Datos everywhere!

Datos everywhere!

 

Debemos de empezar por algo, los diferentes lenguajes de programación y otras herramientas denominadas Open Source son un excelente comienzo!!

 

Python y R para empezar

Python y R para empezar

 

Necesitamos ver el ecosistema, nuestra realidad y tomar la mejor decisión para ver por donde empezamos, todos los lenguajes son utiles, pero no podemos saberlo todo.

 

Ecosistema de R

Ecosistema de R

 

Para discutir la próxima sesión, revisen el articulo, al inicio de cada sesión comentaremos algo similar, ya sea dudas de ustedes ó buenos articulos que recomendaré.

https://www.makeuseof.com/tag/how-programming-affects-brain/

 

Dudas del Open Source, revisen el siguiente Link https://www.gnu.org/licenses/quick-guide-gplv3.html y naveguen.

 

Getting Started with R Programming

OBJETIVO: Breve historia de R y contexto

 

Historia de R

 

Ross Ihaka and Robert Gentleman desarrollaron R como un software free cuando impartían clases en la Universidad de Auckland en New Zealand a principios de 1990.

Lo crearon a partir del lenguaje estadístico denominado S y para diferenciar su trabajo usaron una sintaxis similar para su propio uso. En 1993 anunciaron su colaboración en las noticias del mailing list de S, muchas personas se interesaron y se sumaron a la colaboración. Dicha colaboración sigue en pie en el sitio https://www.r-project.org/

El lanzamiento oficial (1.0.0) fue en Febrero del 2000, para ese entonces ya era parte de la fundación de software libre GNU. Actualmente la última versión (3.6) está disponible desde Abril de este año para más de 30 países.

 

Ventajas y usos de R

 

Es un software que ayuda a la manipulación de datos, cálculos aritméticos y visualización de gráficos dinámicos.

El código es de fácil escritura y comprensión.

Excelente para el cálculo de matrices, vectores, algoritmos complejos.

Existe una colección muy amplia de herramientas para el análisis de datos, visualización y otros propósitos. dplyr, data.table, tidyr y ggplot2 algunos de ellos.

Fácil desarrollo de herramientas con buen nivel de interacción como blogdown y xaringan.

 

Iniciando

 

Para descargar e instalar R en su última versión, deberán utilizar el siguiente link https://cran.r-project.org/bin/windows/base/ donde encontraran la versión para Windows que es el sistema operativo que todos tenemos.

Un lenguaje amigable, fácil de usar y entender, simple y efectivo.

Con R se distribuyen algunos paquetes, pero existen muchos más en el sitio CRAN, cubriendo así un amplio espectro de herramientas estadísticas, de cálculo y de visualización que les harán más divertida la vida.

El link con todo el material del curso esta en mi repo personal de Git, tengan cuidado de no aruinarlo, luego hacemos otro curso de Git. https://github.com/ricardolastra/Workshop_Seguros

En los próximos días les hare llegar documentos como estos, los cuales les serán de gran apoyo con cosas básicas, no podemos retener todo en mente, además que no cubriremos muchos comandos, ejemplos y funciones de las paqueterías.

 

 

Para las siguientes sesiones usaremos una interface muy “Fancy” denominada RStudio, la cual podrán descargar en el siguiente link https://www.rstudio.com/products/rstudio/download/ que los llevara a tener la versión más reciente 1.2.1335

Existen más programas o UI´s muy padres, Anaconda (luego revisan el siguiente link) https://www.anaconda.com/distribution/ tiene excelentes herramientas con Python y aun para R. Sin embargo una de las mejores herramientas con R es RStudio.

No nos perdemos de mucho, échenle un ojo.

 

 

Están listos?

R_Basico_1.0

OBJETIVO: Vistazo de Rstudio y primeros comandos

 

Recordando…

R es un lenguaje computacional diseñado para la estadística.

  • Es gratis
  • Amplias librerias
  • Basto soporte, mailing list, blogs, tutoriales
  • De facíl desarrollo
  • Desarrolado por estadísticos

 

Recuerden que cualquier cosa que escriban en R muy probablemente no seran los primeros en intentarlo, hay una gran posibilidad que alguien ya haya escrito algun paquete justo para lo que necesitan.

Hecharemos un vistazo a la parte basica de RStudio que nos permitira entender el funcionamiento del lenguaje, sus alcances, sus aplicaciones y sus ventajas sobre las herramientas actuales que conocemos.

 

 

Inicien RStudio y abran un R script:

  • En Windows click en el boton de Inicio y busquen Rstudio.
  • Ya en Rstudio den click en File -> New File -> R script
  • Guardenlo en su carpeta del curso File -> Save As -> ruta a su carpeta y nombre del file

Ahora traten de reproducir las siguientes notas.

Nota. Recuerden el simbolo # para comentar su codigo.

 

FORMAS DE DECLARAR Ó GUARDAR Ó ALMACENAR Ó MANTENER VARIABLES:

x = 3
y <- 4
5 -> z

Asi estan almacenadas en el ambiente:

x
## [1] 3
y
## [1] 4
z
## [1] 5

Nota. Los valores que guardamos pueden ser usados en subsecuentes operaciones, recuerden que lo mas limpio es poner el nombre a la izquierda y los valores a la derecha.

 

SOBRESCRIBIR VARIABLES:

x = 4
y <- 5
6 -> z

Asi estan almacenadas en el ambiente:

x
## [1] 4
y
## [1] 5
z
## [1] 6

CALCULOS BASICOS:

Operadores

#SUMAS
25+25
## [1] 50
x+y
## [1] 9
#MULTIPLICACIONES
35*2
## [1] 70
#DIVISIONES
x/y
## [1] 0.8
#RESTAS
z-x-y
## [1] -3
#Potencias
3^2
## [1] 9
y^x
## [1] 625

CALCULOS BASICOS

FORMAS DE NO HACER CALCULOS BASICOS, ASI NO ES LA SINTAXIS DE R:

#SUMAS
#=25+25

#MULTIPLICACIONES
#(35)(2)

VECTORES

#Basicos
x <- c(1,4,3,1,3,2,2,2)
x[1]
## [1] 1
x[2]
## [1] 4
x[2:4]
## [1] 4 3 1
x[-1]
## [1] 4 3 1 3 2 2 2
x[-4]
## [1] 1 4 3 3 2 2 2
x[x<=3]
## [1] 1 3 1 3 2 2 2
#Función which (más adelante veremos, for, while, ifelse)
#Devuelve la posición del elemento que pidamos validar.
which(x==1)
## [1] 1 4
#Quizá con el alfabeto es más claro.
which(letters == "g")
## [1] 7
x==1
## [1]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
#Mas complejos con operaciones, guardamos vectores
Cebollas.huacal <- c(12,4,4,6,9,3)
Chiles.caja <- c(5,3,2,2,12,9)
#Multiplicamos vectores
Cebollas.precio <- Cebollas.huacal *200
Chiles.precio <- Chiles.caja *100
#Sumamos vectores
Cebollas.precio + Chiles.precio
## [1] 2900 1100 1000 1400 3000 1500
#Tambien lo podemos hacer asi en 1 sola linea
Cebollas.huacal *200 + Chiles.caja *100
## [1] 2900 1100 1000 1400 3000 1500

OBJETOS

objeto <- 3*3

FUNCIONES

myfun = function(x, y){
  return (x*y)
}
myfun(3,4)
## [1] 12
myfun2 = function(x, n=2){
  return(x^n)
}
myfun2(4)
## [1] 16
myfun2(2, n=3)
## [1] 8

R LOOP´S (While - For)

Sintaxis WHILE:

while (test_expression){ statement }

 

i <- 1
while (i < 6) {
  print(i)
  i = i+1
  }
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

 

Sintaxis FOR:

for(var in seq){ expr }

 

for (año in c(2014,2015,2016,2017,2018,2019)){
  print(paste("El año actual es", año))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"

 

Aún mejor…

for (año in 2014:2019){
  print(paste("El año actual es", año))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"

 

lo ideal…

años <- c(2014,2015,2016,2017,2018,2019)
for (i in años){
  print(paste("El año actual es", i))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"

 

R FUNCTION´S (Ifelse - Which)

Sintaxis IFELSE:

ifelse(test, yes, no)

 

plazo <- c(6,9,12,24,30)
ifelse(plazo==9, "aplica" , "no aplica")
## [1] "no aplica" "aplica"    "no aplica" "no aplica" "no aplica"

 

más divertido…

plazo <- c(6,9,12,24,30)
ifelse(plazo>=9 & plazo<=24, "aplica" , "no aplica")
## [1] "no aplica" "aplica"    "aplica"    "aplica"    "no aplica"

 

Sintaxis WHICH:

which(x, arr.ind = FALSE, useNames = TRUE)

 

which(letters == "g")
## [1] 7

 

Nota. Para más detalles consulten los documentos de apoyo del repo de git en el documento refcard_2.0_operators_others

 

R_Basico_1.1

OBJETIVO: Como cargar datos, paquetes y librerias

 

Cargando nuestros datos

R tiene algunas formas de leer archivos, los mas comunes son tablas, archivos planos, archivos con alguna codificacion especifica o estructurada. Aunque no sera el objetivo del curso, leer cadenas de texto, datos sin estructuras definidas o espcificas y archivos sin algun tipo de orden, es algo que tambien se puede hacer en R.

Para leer datos de un archivo, primero deben saber que tipo de archivo es, es decir, su extension. La tabla de abajo muestra una lista de funciones que pueden ser importadas segun el formato del archivo.

tipo de datos funcion paquete
comma separated (.csv) read_csv() readr
other delimited formats read_delim() readr
R (.Rds) read_rds() readr
Stata (.dta) read_dta() haven
SPSS (.sav) read_spss() haven
SAS (.sas7bdat) read_sas() haven
Excel (.xls, .xlsx) read_excel() readxl
regular delimited files fread() data.table

Nota. Mas información ver documento de apoyo data-import

 

Paqueterias de R ó los famosos packages

Los paquetes de R pueden ser instalados desde el famoso CRAN, el cual es una red de archivos de alta gama. Para ello deberán usar la función install.packages. Cuando instalan un paquete ponen una copia en la computadora de forma local, pero aun no lo hace “usable”, solo esta “disponible”. Para usarlo deberan adjuntar o cargar la funcion de library.

Gracias a nuestro amigo Hadley y otros colaboradores, en este curso usaremos para prueba de carga el famoso “the tidyverse”. Tidyverse nos brinda grandes herramientas para manipulación basica y avanzada de datos, es muy funcional, facíl e intuitiva.

 

install.packages("tidyverse")
library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------ tidyverse 1.2.1 --
## v ggplot2 3.1.1       v purrr   0.3.2  
## v tibble  2.1.1       v dplyr   0.8.0.1
## v tidyr   0.8.3       v stringr 1.4.0  
## v readr   1.3.1       v forcats 0.4.0
## -- Conflicts --------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

 

Nota. Ayuda en R

Podemos usar la función help o el operador al inicio de cada sentencia ?.

#help(help)
#?str

 

Cargando nuestro primer archivo:

read_csv("bases/PRIMAS_EJE_CARGA.csv")
## Warning: Missing column names filled in: 'X2' [2], 'X3' [3], 'X4' [4],
## 'X5' [5], 'X6' [6], 'X7' [7], 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11],
## 'X12' [12]
## Parsed with column specification:
## cols(
##   `TITULOS FEOS DE REPORTES CLASICOS DE SIISA` = col_character(),
##   X2 = col_character(),
##   X3 = col_character(),
##   X4 = col_character(),
##   X5 = col_character(),
##   X6 = col_character(),
##   X7 = col_character(),
##   X8 = col_character(),
##   X9 = col_character(),
##   X10 = col_character(),
##   X11 = col_character(),
##   X12 = col_character()
## )
## # A tibble: 23,347 x 12
##    `TITULOS FEOS D~ X2    X3    X4    X5    X6    X7    X8    X9    X10  
##    <chr>            <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
##  1 <NA>             <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
##  2 POLIZA           ENDO~ ID_C~ PRIMA PATE~ MATE~ NOMB~ NOMB~ SEXO  PLAZO
##  3 D00- 201901      1     1     2097~ MURR~ GAREY LETI~ <NA>  F     15   
##  4 D00- 201901      2     2     3202~ MEZA  MEZA  OMAR  <NA>  M     15   
##  5 D00- 201901      1     3     6028~ LOPEZ ARAG~ AARON FEDE~ M     21   
##  6 D00- 201901      2     4     8425~ CARD~ GUEV~ AARON IVAN  M     21   
##  7 D00- 201901      1     5     2842~ JAVI~ MARQ~ AARON ALEJ~ M     27   
##  8 D00- 201901      2     6     1593~ CAST~ RANG~ AARON <NA>  M     9    
##  9 D00- 201901      1     7     1403~ GUER~ RODR~ AARON <NA>  M     15   
## 10 D00- 201901      2     8     3766~ BENC~ RUBIO AARON MART~ M     9    
## # ... with 23,337 more rows, and 2 more variables: X11 <chr>, X12 <chr>

UPS!! Problemas!!!

 

Hagamos que este disponible la libreria…

library(readr)
read_csv("bases/PRIMAS_EJE_CARGA.csv")
## Warning: Missing column names filled in: 'X2' [2], 'X3' [3], 'X4' [4],
## 'X5' [5], 'X6' [6], 'X7' [7], 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11],
## 'X12' [12]
## Parsed with column specification:
## cols(
##   `TITULOS FEOS DE REPORTES CLASICOS DE SIISA` = col_character(),
##   X2 = col_character(),
##   X3 = col_character(),
##   X4 = col_character(),
##   X5 = col_character(),
##   X6 = col_character(),
##   X7 = col_character(),
##   X8 = col_character(),
##   X9 = col_character(),
##   X10 = col_character(),
##   X11 = col_character(),
##   X12 = col_character()
## )
## # A tibble: 23,347 x 12
##    `TITULOS FEOS D~ X2    X3    X4    X5    X6    X7    X8    X9    X10  
##    <chr>            <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
##  1 <NA>             <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
##  2 POLIZA           ENDO~ ID_C~ PRIMA PATE~ MATE~ NOMB~ NOMB~ SEXO  PLAZO
##  3 D00- 201901      1     1     2097~ MURR~ GAREY LETI~ <NA>  F     15   
##  4 D00- 201901      2     2     3202~ MEZA  MEZA  OMAR  <NA>  M     15   
##  5 D00- 201901      1     3     6028~ LOPEZ ARAG~ AARON FEDE~ M     21   
##  6 D00- 201901      2     4     8425~ CARD~ GUEV~ AARON IVAN  M     21   
##  7 D00- 201901      1     5     2842~ JAVI~ MARQ~ AARON ALEJ~ M     27   
##  8 D00- 201901      2     6     1593~ CAST~ RANG~ AARON <NA>  M     9    
##  9 D00- 201901      1     7     1403~ GUER~ RODR~ AARON <NA>  M     15   
## 10 D00- 201901      2     8     3766~ BENC~ RUBIO AARON MART~ M     9    
## # ... with 23,337 more rows, and 2 more variables: X11 <chr>, X12 <chr>

Clasico de SIISA y nuestros amigos de TI!!!

 

library(readr)
read_csv("bases/PRIMAS_EJE_CARGA.csv", skip = 2)
## Parsed with column specification:
## cols(
##   POLIZA = col_character(),
##   ENDOSO = col_double(),
##   ID_CONS = col_double(),
##   PRIMA = col_double(),
##   PATERNO = col_character(),
##   MATERNO = col_character(),
##   NOMBRE = col_character(),
##   NOMBRE_2 = col_character(),
##   SEXO = col_character(),
##   PLAZO = col_double(),
##   SEG_SOCIAL = col_double(),
##   ID_PROD = col_double()
## )
## # A tibble: 23,345 x 12
##    POLIZA ENDOSO ID_CONS  PRIMA PATERNO MATERNO NOMBRE NOMBRE_2 SEXO  PLAZO
##    <chr>   <dbl>   <dbl>  <dbl> <chr>   <chr>   <chr>  <chr>    <chr> <dbl>
##  1 D00- ~      1       1 20975. MURRIE~ GAREY   LETIC~ <NA>     F        15
##  2 D00- ~      2       2 32022. MEZA    MEZA    OMAR   <NA>     M        15
##  3 D00- ~      1       3 60285. LOPEZ   ARAGON  AARON  FEDERICO M        21
##  4 D00- ~      2       4  8425. CARDONA GUEVARA AARON  IVAN     M        21
##  5 D00- ~      1       5 28429. JAVIER  MARQUEZ AARON  ALEJAND~ M        27
##  6 D00- ~      2       6 15936. CASTIL~ RANGEL  AARON  <NA>     M         9
##  7 D00- ~      1       7 14032. GUERRE~ RODRIG~ AARON  <NA>     M        15
##  8 D00- ~      2       8  3767. BENCOMO RUBIO   AARON  MARTIN   M         9
##  9 D00- ~      1       9  1742. GARCIA  RAMON   AARON  NEFTALI  M         3
## 10 D00- ~      2      10 16206. SEGUNDO DIONIC~ AARON  MELCHOR  M        15
## # ... with 23,335 more rows, and 2 more variables: SEG_SOCIAL <dbl>,
## #   ID_PROD <dbl>

 

primas <- read_csv("bases/PRIMAS_EJE_CARGA.csv", skip = 2, n_max = 5)
## Parsed with column specification:
## cols(
##   POLIZA = col_character(),
##   ENDOSO = col_double(),
##   ID_CONS = col_double(),
##   PRIMA = col_double(),
##   PATERNO = col_character(),
##   MATERNO = col_character(),
##   NOMBRE = col_character(),
##   NOMBRE_2 = col_character(),
##   SEXO = col_character(),
##   PLAZO = col_double(),
##   SEG_SOCIAL = col_double(),
##   ID_PROD = col_double()
## )

 

#install.packages("data.table")
library(data.table)
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
## The following object is masked from 'package:purrr':
## 
##     transpose
primas_fread <- fread("bases/PRIMAS_EJE_CARGA.csv", skip = 2, sep = ",")
head(primas_fread,5)
##         POLIZA ENDOSO ID_CONS    PRIMA  PATERNO MATERNO  NOMBRE  NOMBRE_2
## 1: D00- 201901      1       1 20975.47 MURRIETA   GAREY LETICIA          
## 2: D00- 201901      2       2 32021.65     MEZA    MEZA    OMAR          
## 3: D00- 201901      1       3 60285.43    LOPEZ  ARAGON   AARON  FEDERICO
## 4: D00- 201901      2       4  8425.26  CARDONA GUEVARA   AARON      IVAN
## 5: D00- 201901      1       5 28428.92   JAVIER MARQUEZ   AARON ALEJANDRO
##    SEXO PLAZO SEG_SOCIAL ID_PROD
## 1:    F    15          1     720
## 2:    M    15          2     700
## 3:    M    21          1     700
## 4:    M    21          1     700
## 5:    M    27          1     700

 

Ahora validamos ó exploramos los datos que cargamos en el ambiente con las siguientes funciones estadísticas

class(primas_fread)
## [1] "data.table" "data.frame"

 

Podemos obtener aún más

library(dplyr)
glimpse(primas_fread)
## Observations: 23,345
## Variables: 12
## $ POLIZA     <chr> "D00- 201901", "D00- 201901", "D00- 201901", "D00- ...
## $ ENDOSO     <int> 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, ...
## $ ID_CONS    <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ...
## $ PRIMA      <dbl> 20975.47, 32021.65, 60285.43, 8425.26, 28428.92, 15...
## $ PATERNO    <chr> "MURRIETA", "MEZA", "LOPEZ", "CARDONA", "JAVIER", "...
## $ MATERNO    <chr> "GAREY", "MEZA", "ARAGON", "GUEVARA", "MARQUEZ", "R...
## $ NOMBRE     <chr> "LETICIA", "OMAR", "AARON", "AARON", "AARON", "AARO...
## $ NOMBRE_2   <chr> "", "", "FEDERICO", "IVAN", "ALEJANDRO", "", "", "M...
## $ SEXO       <chr> "F", "M", "M", "M", "M", "M", "M", "M", "M", "M", "...
## $ PLAZO      <int> 15, 15, 21, 21, 27, 9, 15, 9, 3, 15, 15, 15, 21, 9,...
## $ SEG_SOCIAL <int> 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, ...
## $ ID_PROD    <int> 720, 700, 700, 700, 700, 720, 700, 720, 700, 700, 7...

 

Un poco más

str(primas_fread)
## Classes 'data.table' and 'data.frame':   23345 obs. of  12 variables:
##  $ POLIZA    : chr  "D00- 201901" "D00- 201901" "D00- 201901" "D00- 201901" ...
##  $ ENDOSO    : int  1 2 1 2 1 2 1 2 1 2 ...
##  $ ID_CONS   : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PRIMA     : num  20975 32022 60285 8425 28429 ...
##  $ PATERNO   : chr  "MURRIETA" "MEZA" "LOPEZ" "CARDONA" ...
##  $ MATERNO   : chr  "GAREY" "MEZA" "ARAGON" "GUEVARA" ...
##  $ NOMBRE    : chr  "LETICIA" "OMAR" "AARON" "AARON" ...
##  $ NOMBRE_2  : chr  "" "" "FEDERICO" "IVAN" ...
##  $ SEXO      : chr  "F" "M" "M" "M" ...
##  $ PLAZO     : int  15 15 21 21 27 9 15 9 3 15 ...
##  $ SEG_SOCIAL: int  1 2 1 1 1 1 1 1 1 1 ...
##  $ ID_PROD   : int  720 700 700 700 700 720 700 720 700 700 ...
##  - attr(*, ".internal.selfref")=<externalptr>

 

la mejor información!!!

summary(primas_fread)
##     POLIZA              ENDOSO          ID_CONS          PRIMA       
##  Length:23345       Min.   : 1.000   Min.   :    1   Min.   : -2335  
##  Class :character   1st Qu.: 1.000   1st Qu.: 5837   1st Qu.:  5637  
##  Mode  :character   Median : 2.000   Median :11673   Median : 11046  
##                     Mean   : 1.504   Mean   :11673   Mean   : 14705  
##                     3rd Qu.: 2.000   3rd Qu.:17509   3rd Qu.: 19253  
##                     Max.   :33.000   Max.   :23345   Max.   :415787  
##    PATERNO            MATERNO             NOMBRE         
##  Length:23345       Length:23345       Length:23345      
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##    NOMBRE_2             SEXO               PLAZO         SEG_SOCIAL   
##  Length:23345       Length:23345       Min.   : 3.00   Min.   :1.000  
##  Class :character   Class :character   1st Qu.: 9.00   1st Qu.:1.000  
##  Mode  :character   Mode  :character   Median :15.00   Median :1.000  
##                                        Mean   :16.18   Mean   :1.137  
##                                        3rd Qu.:21.00   3rd Qu.:1.000  
##                                        Max.   :34.00   Max.   :4.000  
##     ID_PROD    
##  Min.   : 242  
##  1st Qu.: 638  
##  Median : 700  
##  Mean   : 669  
##  3rd Qu.: 700  
##  Max.   :1780

 

El artículo a discutir al inicio de la sesión numero 3 es el siguiente:

https://www.elfinanciero.com.mx/tech/por-que-tus-hijos-deberian-aprender-a-programar

 

R_Basico_1.2

OBJETIVO: Manejo de datos

 

Normalmente los datos en R son almacenados como data.frame

Un data.frame es una lista de vectores de la misma longitud, piensenlos como una tabla de observaciones (individuos), cada entrada del vector en la lista forma una columna, cada columna puede ser de diferente tipo, conocemos a las columnas como variables y a las filas como observaciones.

Un data.frame tiene entonces dos dimensiones correspondientes al numero de filas y columnas, en ese estricto orden.

Empezaremos a hacer nuestros primeros subsets, muy utiles en la vida real.

 

Empezamos con un clasico, filter

filter(primas_fread, PLAZO == 34 & SEXO == "F")
##        POLIZA ENDOSO ID_CONS    PRIMA   PATERNO MATERNO NOMBRE   NOMBRE_2
## 1 D00- 201901      1   16619 18224.27 HERNANDEZ MORALES  MARIA DEL CARMEN
##   SEXO PLAZO SEG_SOCIAL ID_PROD
## 1    F    34          1    1780
filter(primas_fread, PLAZO == 3, NOMBRE %in% c("AARON", "RICARDO"))
##         POLIZA ENDOSO ID_CONS    PRIMA    PATERNO   MATERNO  NOMBRE
## 1  D00- 201901      1       9  1742.10     GARCIA     RAMON   AARON
## 2  D00- 201901      2      16  4997.92      REYES    URBINA   AARON
## 3  D00- 201901      1      17  9411.26 DE LA ROSA      SOTO   AARON
## 4  D00- 201901      2      22  1086.45     TORRES    ALONSO   AARON
## 5  D00- 201901      2   20218  7138.09    RAMIREZ      MAAS RICARDO
## 6  D00- 201901      1   20241  3867.84   OCEGUERA     GOMEZ RICARDO
## 7  D00- 201901      2   20242  3911.27     JUAREZ   RAMIREZ RICARDO
## 8  D00- 201901      2   20256  3892.39   MARTINEZ    GARCIA RICARDO
## 9  D00- 201901      2   20274  3905.70     FLORES    GARCIA RICARDO
## 10 D00- 201901      1   20275  3107.25     BURGOS  GAMONEDA RICARDO
## 11 D00- 201901      1   20291  3440.37     MORENO     OLIVA RICARDO
## 12 D00- 201901      2   20304 13680.13       NAVA CERVANTES RICARDO
## 13 D00- 201901      1   20305 16946.59       NAVA CERVANTES RICARDO
## 14 D00- 201901      1   20325  8340.28  FRANCISCO    JUAREZ RICARDO
## 15 D00- 201901      1   20345 10971.09   RENTERIA     SALAS RICARDO
## 16 D00- 201901      1   20347  3140.36 ALTAMIRANO   PIZARRO RICARDO
##     NOMBRE_2 SEXO PLAZO SEG_SOCIAL ID_PROD
## 1    NEFTALI    M     3          1     700
## 2     ADRIAN    M     3          1     700
## 3    ALBERTO    M     3          1     700
## 4   EMMANUEL    M     3          1     700
## 5               M     3          1     700
## 6               M     3          1     754
## 7    ALBERTO    M     3          1     700
## 8    ANTONIO    M     3          1     700
## 9               M     3          1     700
## 10              M     3          1     700
## 11              M     3          1     700
## 12 FRANCISCO    M     3          1     700
## 13              M     3          1     700
## 14              M     3          1     700
## 15     DARIO    M     3          1     700
## 16              M     3          1     700

 

Buen acceso a ciertas observaciones, slice

slice(primas_fread, 1:5)
##        POLIZA ENDOSO ID_CONS    PRIMA  PATERNO MATERNO  NOMBRE  NOMBRE_2
## 1 D00- 201901      1       1 20975.47 MURRIETA   GAREY LETICIA          
## 2 D00- 201901      2       2 32021.65     MEZA    MEZA    OMAR          
## 3 D00- 201901      1       3 60285.43    LOPEZ  ARAGON   AARON  FEDERICO
## 4 D00- 201901      2       4  8425.26  CARDONA GUEVARA   AARON      IVAN
## 5 D00- 201901      1       5 28428.92   JAVIER MARQUEZ   AARON ALEJANDRO
##   SEXO PLAZO SEG_SOCIAL ID_PROD
## 1    F    15          1     720
## 2    M    15          2     700
## 3    M    21          1     700
## 4    M    21          1     700
## 5    M    27          1     700

Que pasó aqui?

head(slice(primas_fread,-c(1,2)))
##        POLIZA ENDOSO ID_CONS    PRIMA  PATERNO   MATERNO NOMBRE  NOMBRE_2
## 1 D00- 201901      1       3 60285.43    LOPEZ    ARAGON  AARON  FEDERICO
## 2 D00- 201901      2       4  8425.26  CARDONA   GUEVARA  AARON      IVAN
## 3 D00- 201901      1       5 28428.92   JAVIER   MARQUEZ  AARON ALEJANDRO
## 4 D00- 201901      2       6 15935.75 CASTILLO    RANGEL  AARON          
## 5 D00- 201901      1       7 14032.46 GUERRERO RODRIGUEZ  AARON          
## 6 D00- 201901      2       8  3766.85  BENCOMO     RUBIO  AARON    MARTIN
##   SEXO PLAZO SEG_SOCIAL ID_PROD
## 1    M    21          1     700
## 2    M    21          1     700
## 3    M    27          1     700
## 4    M     9          1     720
## 5    M    15          1     700
## 6    M     9          1     720

Revisemos con un head y un tail

head(primas_fread)
##         POLIZA ENDOSO ID_CONS    PRIMA  PATERNO MATERNO  NOMBRE  NOMBRE_2
## 1: D00- 201901      1       1 20975.47 MURRIETA   GAREY LETICIA          
## 2: D00- 201901      2       2 32021.65     MEZA    MEZA    OMAR          
## 3: D00- 201901      1       3 60285.43    LOPEZ  ARAGON   AARON  FEDERICO
## 4: D00- 201901      2       4  8425.26  CARDONA GUEVARA   AARON      IVAN
## 5: D00- 201901      1       5 28428.92   JAVIER MARQUEZ   AARON ALEJANDRO
## 6: D00- 201901      2       6 15935.75 CASTILLO  RANGEL   AARON          
##    SEXO PLAZO SEG_SOCIAL ID_PROD
## 1:    F    15          1     720
## 2:    M    15          2     700
## 3:    M    21          1     700
## 4:    M    21          1     700
## 5:    M    27          1     700
## 6:    M     9          1     720
tail(primas_fread)
##         POLIZA ENDOSO ID_CONS    PRIMA  PATERNO MATERNO     NOMBRE
## 1: D00- 201901      2   23340  1923.02  PEDRAZA    PE?A ZURISADDAI
## 2: D00- 201901      1   23341 15031.21    PINTO  DUARTE ZURISADDAI
## 3: D00- 201901      2   23342 14564.44   ESPA?A   PEREZ      ZUSET
## 4: D00- 201901      1   23343  5693.09 QUINTERO  GARCIA     ZUXCEL
## 5: D00- 201901      2   23344 12837.95  ESCOBAR SANCHEZ     ZYANYA
## 6: D00- 201901      3   23345 30091.90 VALENCIA   LOPEZ    ZYZLILA
##    NOMBRE_2 SEXO PLAZO SEG_SOCIAL ID_PROD
## 1:             F    15          4     642
## 2:             F    27          4     638
## 3:             F    15          1     638
## 4: CRISTINA    F    27          1     638
## 5:  MARIANA    F    27          1     638
## 6:             F     9          1     638

 

Entonces slice y filter se usan para extraer algun tipo de “observación, row, fila, value, entrada, etc.”, de la misma forma usamos select para acceder a las columnas.

select(slice(primas_fread, 23340:23345), c(PATERNO, MATERNO, NOMBRE))
##    PATERNO MATERNO     NOMBRE
## 1  PEDRAZA    PE?A ZURISADDAI
## 2    PINTO  DUARTE ZURISADDAI
## 3   ESPA?A   PEREZ      ZUSET
## 4 QUINTERO  GARCIA     ZUXCEL
## 5  ESCOBAR SANCHEZ     ZYANYA
## 6 VALENCIA   LOPEZ    ZYZLILA

…podemos usar algo super util como el simbolo de $, el cual nos ayudara a acceder a una columna especifica de un df

sd(primas_fread$PRIMA)
## [1] 14830.78

o tambien…

mean(primas_fread$PRIMA)
## [1] 14704.87

 

Ejercicio 1

El objetivo del siguiente ejericio es para que practiquen, algunas cosas que hemos aprendido, traten de hacerlo siguiendo las notas, recuerden que deben de tener instalado y cargado el tidyverse.

Usen el archivo que esta en la carpeta de las bases de mi repo denominado PRIMAS_EJE_AUTOS.csv.

 

  1. Lean la base del ejericio con alguna función de la libreria readr, y limiten la lectura a 20 rows.

 

  1. Lean TODA la base del ejericio y asignen la información a una variable, traten de quitar el encabezado feo de los reportes de SIISA.

 

  1. Ahora, con su variable, usen por lo menos dos de las funciones para exploración de datos.

 

  1. Por último, de la información que ahora esta en su variable, usando LOOP´S (for e ifelse) reemplacen los productos (ID_PROD) que sean IGUALES a 700 por el producto (ID_PROD) 750.

 

Revisen el siguiente video para comentarlo la proxima sesión.

https://youtu.be/sTNfFatKfoI

 

R_dplyr

OBJETIVO: Pipes, datos en forma tidy y vervos de la librería

 

Sigan cuidadosamente las siguientes instrucciones, inicien RStudio y generen un nuevo proyecto:

  • En Windows click en el botón de Inicio y busquen Rstudio.
  • Ya en Rstudio den click en File -> New Project... -> Existing Directory -> Browse... -> seleccionar carpeta destino -> Open -> Create Project
  • Ya que se abre otra pantalla de R, dar click en File -> New File -> R script
  • Guárdenlo en su carpeta del Proyecto nuevo que acabamos de crear. File -> Save As -> ruta a su carpeta y nombre del file
  • Instalen dplyr(en caso de no tenerlo aún)
  • Iniciemos con lo siguiente:

 

Debemos cargar el archivo ART_492_JUNIO_2019 con varias pestañas, contribucion de nuestro amigo LEE.

De la siguiente forma cargamos 1 sola pestaña, pero no es la escencia de esto.

library(dplyr)
library(readxl)
pestaña <- read_excel("C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/ART_492_JUNIO_2019.xlsx", sheet = 2)
head(pestaña)

 

Revisamos de la siguiente manera las pestañas y seleccionamos la que queremos revisar.

#recuerden que el path de cada equipo es diferente
ruta <- "C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/ART_492_JUNIO_2019.xlsx"
excel_sheets(path = ruta)
##  [1] "SERGIO CARBALLO (2)"     "AGENTES SERGIO CARBALLO"
##  [3] "MARCELA HUERTA (2)"      "JOSE MARIA GARCIA (2)"  
##  [5] "JORGE VERGARA MACIP"     "JOSE MARIA GARCIA"      
##  [7] "JERRY O´HEA (2)"         "JERRY O´HEA"            
##  [9] "SERGIO CARBALLO"         "MICHAEL SCHITTEK"       
## [11] " AGENTES MICHAEL"        "MARCELA HUERTA"         
## [13] "ADEUDOS TOTAL"           "DETALLE POR ANALISTA"   
## [15] "Hoja6"

Ojo. Muestra inclusive las pestañas que est ocultas.

 

Cargamos el archivo y la pestaña deseada:

emision <- read_excel(path = ruta, sheet = "SERGIO CARBALLO")
head(emision)

 

Revisamos los datos:

summary(emision)

 

Verbos de dplyr que usaremos:

  • mutate() adds new variables that are functions of existing variables
  • select() picks variables based on their names.
  • filter() picks cases based on their values.
  • summarise() reduces multiple values down to a single summary.
  • arrange() changes the ordering of the rows.

Provided by https://dplyr.tidyverse.org/

Nota. Usaremos un simbolo muy curioso para todo esto, operator(%>%)

 

Iniciamos con el verbo mutate(), el cual nos genera una nueva variable a partir de la suma de columnas seleccionadas que contienen cierta condición.

emision_modificado <- emision %>%
  mutate(CUENTA_DOCS = rowSums(.[24:43]=="Si", na.rm=TRUE))

 

Revisamos como quedo el nuevo dataset.

head(emision_modificado)

 

emision_modificado <- emision_modificado %>%
  mutate(PORCENTAJE_CUMPLI = (CUENTA_DOCS/43)*100)
#Revisamos la nueva variable
summary(emision_modificado$PORCENTAJE_CUMPLI)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   0.000   1.975   0.000  13.953

 

Ahora revisamos que hace el verbo select().

emision_res <- emision_modificado %>%
  select(c("Sucursal","Nombre Sucursal","Prima Convertida"))

 

colnames(emision_res)
## [1] "Sucursal"         "Nombre Sucursal"  "Prima Convertida"

 

No guardamos lo siguiente en la variable, solo observen que pasa.

emision_modificado %>%
  select(ends_with("ramo")) %>%
  head()
## # A tibble: 6 x 4
##    Ramo `Descripcion Ramo` Subramo `Descripcion Subramo`
##   <dbl> <chr>                <dbl> <chr>                
## 1     7 PAQUETE                  3 OBRAS CIVILES        
## 2     3 TRANSPORTES              5 CASCOS DE BUQUES     
## 3     7 PAQUETE                  3 OBRAS CIVILES        
## 4     7 PAQUETE                  5 MULTIPLE EMPRESARIAL 
## 5     7 PAQUETE                  5 MULTIPLE EMPRESARIAL 
## 6     3 TRANSPORTES              1 TRANSPORTES DE CARGA

 

Y el verbo filter() similar al que ya habiamos visto.

emision_modificado <- emision_modificado %>%
  filter(`Descripcion Ramo`  == "AUTOMOVILES", Subramo %in% c(1,2))

 

head(emision_modificado)
## # A tibble: 6 x 69
##     `#` Sucursal `Nombre Sucursa~ `Prima Converti~ Agente `Razon Social`
##   <dbl> <chr>    <chr>                       <dbl>  <dbl> <chr>         
## 1     1 D00      MEXICO                    661200.   1593 GRUPO DE ASES~
## 2     1 D00      MEXICO                    570791.    628 WILLIS AGENTE~
## 3     1 D00      MEXICO                    442108.    628 WILLIS AGENTE~
## 4     1 D70      METRO INSURGENT~          297605.   6161 MURGUIA CONSU~
## 5     1 D00      MEXICO                    245154.    828 ASESORES PROF~
## 6     1 D70      METRO INSURGENT~          216150.   6161 MURGUIA CONSU~
## # ... with 63 more variables: Ramo <dbl>, `Descripcion Ramo` <chr>,
## #   Subramo <dbl>, `Descripcion Subramo` <chr>, Ejecutivo...11 <chr>,
## #   Directivo...12 <chr>, Ejecutivo...13 <chr>, Directivo...14 <chr>,
## #   RFC <chr>, IdAseg <chr>, `Razón Social` <chr>, `Fecha de Alta` <dttm>,
## #   `Fecha de Art. 140` <dttm>, Observaciones <chr>, `Tipo Persona` <dbl>,
## #   `Clientes 2016 2017 2018` <dbl>, Moneda <dbl>, Póliza <chr>, `1
## #   IDENTIFICACION OFICIAL"` <chr>, `2 CLAVE UNICA DE REGISTRO DE
## #   POBLACION (CURP)...26` <chr>, `3 CEDULA DE IDENTIFICACION FISCAL
## #   (RFC)...27` <chr>, `4 COMPROBANTE DE DOMICILIO...28` <chr>, `8 FORMATO
## #   CONOCE A TU CLIENTE...29` <chr>, `1 TESTIMONIO NOTARIAL O COPIA DEL
## #   ACTA COSTITUTIVA` <chr>, `2 CEDULA DE IDENTIFICACION FISCAL
## #   (RFC)` <chr>, `3 COMPROBANTE DE DOMICILIO` <chr>, `4 TESTIMONIO O
## #   COPIA DEL PODER NOTARIAL DEL REPRESENTANTE LEGAL` <chr>, `5
## #   IDENTIFICACION OFICIAL DEL REPRESENTANTE LEGAL` <chr>, `6 ESCRITO
## #   FIRMADO QUE ACREDITA LA INSCRIPCION RESPECTIVA (EMPRESA DE RECIENTE
## #   CONSTITUCION)` <chr>, `8 FORMATO CONOCE A TU CLIENTE...36` <chr>, `99
## #   DATOS COMPLETOS...37` <chr>, `1 TESTIMONIO O COPIA CERTIFICADA DEL
## #   PODER NOTARIAL` <lgl>, `2 CONSTANCIA DE NOMBRAMIENTO, EXPEDIDA EN
## #   TERMINOS DEL ART. 90 DE LA LEY DE INST. DE SEGUROS` <lgl>, `3
## #   IDENTIFICACION OFICIAL DEL REPRESENTANTEO REPRESENTANTES LEGALES DE LA
## #   ENTIDAD` <lgl>, `4 COMPROBANTE DE DOMICILIO...41` <lgl>, `5 CEDULA DE
## #   IDENTIFICACION FISCAL (RFC)` <lgl>, `8 FORMATO CONOCE A TU
## #   CLIENTE...43` <lgl>, `9 Y/O ACTA DE MAYORIA QUE SE LE ENTREGA AL
## #   PRESIDENTE MUNICIPAL Y LEY ORGANICA DE LA ADMINISTRACION PU` <lgl>,
## #   `99 DATOS COMPLETOS...45` <lgl>, `1 IDENTIFICACION OFICIAL` <lgl>, `2
## #   CLAVE UNICA DE REGISTRO DE POBLACION (CURP)...47` <lgl>, `3 CEDULA DE
## #   IDENTIFICACION FISCAL (RFC)...48` <lgl>, `4 COMPROBANTE DE
## #   DOMICILIO...49` <lgl>, `8 FORMATO CONOCE A TU CLIENTE...50` <lgl>, `99
## #   DATOS COMPLETOS...51` <lgl>, `5 CARTA PODER DEL APODERADO
## #   LEGAL` <lgl>, `6 IDENTIFICACION DEL APODERADO LEGAL` <lgl>, `7
## #   COMPROBANTE DE DOMICILIO DEL APODERADO LEGAL` <lgl>, `1 PASAPORTE
## #   ORIGINAL Y/O DOCUMENTO QUE ACREDITE SU LEGAL ESTANCIA EN TERRITORIO
## #   MEXICANO...55` <lgl>, `4 COMPROBANTE DE DOMICILIO...56` <lgl>, `8
## #   FORMATO CONOCE A TU CLIENTE...57` <lgl>, `1 COPIA LEGISLADA O
## #   APOSTILLADA DEL DOCTO. QUE ACREDITE SU LEGAL EXISTENCIA` <lgl>, `2
## #   COPIA LEGISLADA O APOSTILLADA DEL PODER DEL REPRESENTANTE LEGAL (NAL.
## #   O EXT.)` <lgl>, `3 COPIA DE LA IDENTIFICACION PERSONAL OFICIAL DEL
## #   REPRESENTANTE O REPRESENTANTES LEGALES` <lgl>, `4 COMPROBANTE DE
## #   DOMICILIO...61` <lgl>, `8 FORMATO CONOCE A TU CLIENTE...62` <lgl>, `99
## #   DATOS COMPLETOS...63` <lgl>, `1 PASAPORTE ORIGINAL Y/O DOCUMENTO QUE
## #   ACREDITE SU LEGAL ESTANCIA EN TERRITORIO MEXICANO...64` <lgl>, `4
## #   COMPROBANTE DE DOMICILIO...65` <lgl>, `8 FORMATO CONOCE A TU
## #   CLIENTE...66` <lgl>, `99 DATOS COMPLETOS...67` <lgl>,
## #   CUENTA_DOCS <dbl>, PORCENTAJE_CUMPLI <dbl>

 

El siguiente verbo summarise() es de gran utilidad, lo usaremos mucho, esperen a que lleguemos al mundo visual de ggplot.

Tenemos la variable emision_res que tiene la extracción de solo 3 columnas, la usamos.

emision_res <- emision_res %>%
  group_by(Sucursal) %>%
  summarise(cuenta = n())

 

emision_res
## # A tibble: 4 x 2
##   Sucursal cuenta
##   <chr>     <int>
## 1 <NA>         50
## 2 D00         191
## 3 D70          10
## 4 F04           1

 

Y por ultimo un verbo para ordenar o acomodar nuestros valores muy usado es arrange()

emision_res %>%
  arrange(desc(cuenta))

 

emision_res <- emision_res %>%
  arrange(cuenta)

 

emision_res
## # A tibble: 4 x 2
##   Sucursal cuenta
##   <chr>     <int>
## 1 F04           1
## 2 D70          10
## 3 <NA>         50
## 4 D00         191

 

Quiamos espacios feos de los nombres de columnas:

names(emision) <- gsub(" ", "_", names(emision))
colnames(emision)
##  [1] "#"                                                                                                     
##  [2] "Sucursal"                                                                                              
##  [3] "Nombre_Sucursal"                                                                                       
##  [4] "Prima_Convertida"                                                                                      
##  [5] "Agente"                                                                                                
##  [6] "Razon_Social"                                                                                          
##  [7] "Ramo"                                                                                                  
##  [8] "Descripcion_Ramo"                                                                                      
##  [9] "Subramo"                                                                                               
## [10] "Descripcion_Subramo"                                                                                   
## [11] "Ejecutivo...11"                                                                                        
## [12] "Directivo...12"                                                                                        
## [13] "Ejecutivo...13"                                                                                        
## [14] "Directivo...14"                                                                                        
## [15] "RFC"                                                                                                   
## [16] "IdAseg"                                                                                                
## [17] "Razón_Social"                                                                                          
## [18] "Fecha_de_Alta"                                                                                         
## [19] "Fecha_de_Art._140"                                                                                     
## [20] "Observaciones"                                                                                         
## [21] "Tipo_Persona"                                                                                          
## [22] "Clientes_2016_2017_2018"                                                                               
## [23] "Moneda"                                                                                                
## [24] "Póliza"                                                                                                
## [25] "1_IDENTIFICACION_OFICIAL\""                                                                            
## [26] "2_CLAVE_UNICA_DE_REGISTRO_DE_POBLACION_(CURP)...26"                                                    
## [27] "3_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)...27"                                                          
## [28] "4_COMPROBANTE_DE_DOMICILIO...28"                                                                       
## [29] "8_FORMATO_CONOCE_A_TU_CLIENTE...29"                                                                    
## [30] "1_TESTIMONIO_NOTARIAL_O_COPIA_DEL_ACTA_COSTITUTIVA"                                                    
## [31] "2_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)"                                                               
## [32] "3_COMPROBANTE_DE_DOMICILIO"                                                                            
## [33] "4_TESTIMONIO_O_COPIA_DEL_PODER_NOTARIAL_DEL_REPRESENTANTE_LEGAL"                                       
## [34] "5_IDENTIFICACION_OFICIAL_DEL_REPRESENTANTE_LEGAL"                                                      
## [35] "6_ESCRITO_FIRMADO_QUE_ACREDITA_LA_INSCRIPCION_RESPECTIVA_(EMPRESA_DE_RECIENTE_CONSTITUCION)"           
## [36] "8_FORMATO_CONOCE_A_TU_CLIENTE...36"                                                                    
## [37] "99_DATOS_COMPLETOS...37"                                                                               
## [38] "1_TESTIMONIO_O_COPIA_CERTIFICADA_DEL_PODER_NOTARIAL"                                                   
## [39] "2_CONSTANCIA_DE_NOMBRAMIENTO,_EXPEDIDA_EN_TERMINOS_DEL_ART._90_DE_LA_LEY_DE_INST._DE_SEGUROS"          
## [40] "3_IDENTIFICACION_OFICIAL_DEL_REPRESENTANTEO_REPRESENTANTES_LEGALES_DE_LA_ENTIDAD"                      
## [41] "4_COMPROBANTE_DE_DOMICILIO...41"                                                                       
## [42] "5_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)"                                                               
## [43] "8_FORMATO_CONOCE_A_TU_CLIENTE...43"                                                                    
## [44] "9_Y/O_ACTA_DE_MAYORIA_QUE_SE_LE_ENTREGA_AL_PRESIDENTE_MUNICIPAL_Y_LEY_ORGANICA_DE_LA_ADMINISTRACION_PU"
## [45] "99_DATOS_COMPLETOS...45"                                                                               
## [46] "1_IDENTIFICACION_OFICIAL"                                                                              
## [47] "2_CLAVE_UNICA_DE_REGISTRO_DE_POBLACION_(CURP)...47"                                                    
## [48] "3_CEDULA_DE_IDENTIFICACION_FISCAL_(RFC)...48"                                                          
## [49] "4_COMPROBANTE_DE_DOMICILIO...49"                                                                       
## [50] "8_FORMATO_CONOCE_A_TU_CLIENTE...50"                                                                    
## [51] "99_DATOS_COMPLETOS...51"                                                                               
## [52] "5_CARTA_PODER_DEL_APODERADO_LEGAL"                                                                     
## [53] "6_IDENTIFICACION_DEL_APODERADO_LEGAL"                                                                  
## [54] "7_COMPROBANTE_DE_DOMICILIO_DEL_APODERADO_LEGAL"                                                        
## [55] "1_PASAPORTE_ORIGINAL_Y/O_DOCUMENTO_QUE_ACREDITE_SU_LEGAL_ESTANCIA_EN_TERRITORIO_MEXICANO...55"         
## [56] "4_COMPROBANTE_DE_DOMICILIO...56"                                                                       
## [57] "8_FORMATO_CONOCE_A_TU_CLIENTE...57"                                                                    
## [58] "1_COPIA_LEGISLADA_O_APOSTILLADA_DEL_DOCTO._QUE_ACREDITE_SU_LEGAL_EXISTENCIA"                           
## [59] "2_COPIA_LEGISLADA_O_APOSTILLADA_DEL_PODER_DEL_REPRESENTANTE_LEGAL_(NAL._O_EXT.)"                       
## [60] "3_COPIA_DE_LA_IDENTIFICACION_PERSONAL_OFICIAL_DEL_REPRESENTANTE_O_REPRESENTANTES_LEGALES"              
## [61] "4_COMPROBANTE_DE_DOMICILIO...61"                                                                       
## [62] "8_FORMATO_CONOCE_A_TU_CLIENTE...62"                                                                    
## [63] "99_DATOS_COMPLETOS...63"                                                                               
## [64] "1_PASAPORTE_ORIGINAL_Y/O_DOCUMENTO_QUE_ACREDITE_SU_LEGAL_ESTANCIA_EN_TERRITORIO_MEXICANO...64"         
## [65] "4_COMPROBANTE_DE_DOMICILIO...65"                                                                       
## [66] "8_FORMATO_CONOCE_A_TU_CLIENTE...66"                                                                    
## [67] "99_DATOS_COMPLETOS...67"

 

…y la magia de dplyr es: un solo PIPE!!!!!

emision %>%
  mutate(CUENTA_DOCS = rowSums(.[24:43]=="Si", na.rm=TRUE)) %>%
  mutate(PORCENTAJE_CUMPLI = (CUENTA_DOCS/43)*100) %>%
  select(c("Sucursal","Nombre_Sucursal","Prima_Convertida","PORCENTAJE_CUMPLI")) %>%
  filter(PORCENTAJE_CUMPLI>0) %>%
  group_by(Sucursal ,Nombre_Sucursal) %>%
  summarise(Prima_Prom = sum(Prima_Convertida)/n(),
            Cumplimiento_prom= sum(PORCENTAJE_CUMPLI)/n())
## # A tibble: 1 x 4
## # Groups:   Sucursal [1]
##   Sucursal Nombre_Sucursal Prima_Prom Cumplimiento_prom
##   <chr>    <chr>                <dbl>             <dbl>
## 1 D00      MEXICO             266124.              10.6

 

Dejamos todas las sucursales, lo guardan en su variable y listo!!!

emision_resumen <- emision %>%
  mutate(CUENTA_DOCS = rowSums(.[24:43]=="Si", na.rm=TRUE)) %>%
  mutate(PORCENTAJE_CUMPLI = (CUENTA_DOCS/43)*100) %>%
  select(c("Sucursal","Nombre_Sucursal","Prima_Convertida","PORCENTAJE_CUMPLI")) %>%
  filter(PORCENTAJE_CUMPLI>=0) %>%
  group_by(Sucursal ,Nombre_Sucursal) %>%
  summarise(Adeudos = n(),
            Prima_Prom = sum(Prima_Convertida)/n(),
            Cumplimiento_prom= sum(PORCENTAJE_CUMPLI)/n()) %>%
  na.omit() %>%
  arrange(Adeudos)
emision_resumen
## # A tibble: 3 x 5
## # Groups:   Sucursal [3]
##   Sucursal Nombre_Sucursal   Adeudos Prima_Prom Cumplimiento_prom
##   <chr>    <chr>               <int>      <dbl>             <dbl>
## 1 F04      METRO ARCOS             1    281196.              0   
## 2 D70      METRO INSURGENTES      10    196118.              0   
## 3 D00      MEXICO                191    241681.              2.61

 

Aplausos!!!

 

Para la siguiente sesión comentaremos esta lectura:

https://infogram.com/es/pagina/visualizacion-datos

R_ggplot

OBJETIVO: Graficar entendiendo los datos, escalas y tipos de gráficos, mejorar visualizaciones actuales

 

Empezamos usando unos nuevos datos fake con propositos didacticos.

library(dplyr)
emision <- read.csv("./bases/Consolidados-7.csv", header = T, stringsAsFactors=F)

 

…exploramos un poco…

str(emision)
## 'data.frame':    28 obs. of  4 variables:
##  $ Año.Contable   : int  2019 2019 2019 2019 2019 2019 2019 2018 2018 2018 ...
##  $ Nombre.Director: chr  "GERARDO PEREZ" "GEORGE W BUSH" "CHEMA" "MARCE VERDURAS" ...
##  $ Emitida        : chr  "2,661,351,720.69" "419,558,997.10" "1,016,438,189.37" "732,761,487.80" ...
##  $ Pagada         : chr  "2,464,282,560.52" "382,555,636.68" "1,063,419,000.60" "954,516,475.69" ...

 

Un regalo!

#Quitamos las comas y redondeamos la cifra, ademas que guardamos la variable como entero
library(readr)
emision <- emision %>%
  mutate(Emitida = parse_number(Emitida),
         Pagada = parse_number(Pagada))
#parse_number esta dentro de readr

 

revisamos de nuevo:

str(emision)
## 'data.frame':    28 obs. of  4 variables:
##  $ Año.Contable   : int  2019 2019 2019 2019 2019 2019 2019 2018 2018 2018 ...
##  $ Nombre.Director: chr  "GERARDO PEREZ" "GEORGE W BUSH" "CHEMA" "MARCE VERDURAS" ...
##  $ Emitida        : num  2.66e+09 4.20e+08 1.02e+09 7.33e+08 3.72e+09 ...
##  $ Pagada         : num  2.46e+09 3.83e+08 1.06e+09 9.55e+08 2.87e+09 ...

 

Ahora si pudieron cargar tidyverse solo habiliten la libreria.

library(ggplot2)

Si NO pudieron cargar tidyverse, descarguen ggplot2 y habiliten la libreria.

install.packages("ggplot2")
library(ggplot2)

 

Ventajas de ggplot2:

  • Muy flexible
  • Fácil de interpretar, sintaxis sencilla
  • Sistema ya muy avanzado para graficar
  • Ecosistema amplio
  • Comunidad amplia, gran soporte
  • Basado en el libro “The Grammar of Graphics”

 

¿Cómo se usa?

Empezamos con la función ggplot(), integrando nuestra base y sus variables (con aes()). Luego agregamos las coordenadas o puntos a graficar con geom_point() o con geom_histogram(), luego las escalas ó colores (como puede ser scale_colour_brewer()), algunas especificaciones como facet_wrap() y hasta títulos o marcas.

 

¿Y si graficamos con R base? ggplot2 VS R base de una manera muy sencilla.

hist(emision$Emitida)

Y con ggplot2 se ve lo mismo de la siguiente forma:

ggplot(emision, aes(x = Emitida)) +
  geom_histogram()

Sin embargo hay que graficar cosas que hagan sentido, pero antes revisemos un poco mas.

 

Aesthetic Mapping

En el mundo de ggplot2 aesthetic significa “algo que puedes ver”. Puedes incluir las siguientes opciones:

  • position (por ejemplo en el eje x o en el eje de las y´s)
  • color (el color de relleno)
  • fill (el color del grafico)
  • shape (forma)
  • linetype
  • size (tamaño)

Cada tipo de gráfico solo acepta un conjunto de datos, es natural de una gráfica de dos dimensiones.

 

Objetos geométricos (geom)

Son los tipos de gráficos que tenemos en cada imagen:

  • Puntos (geom_point, para scatter plots, dot plots, etc.)
  • Lineas (geom_line, para time series, trend lines, etc.)
  • Diagrama de caja y brazo (geom_boxplot)

Un gráfico al menos debe tener un objeto geométrico, y pueden ir agregando más con el símbolo +, que al ponerlo lo identa de manera correcta.

Puedes tener una buena ayuda con los objetos disponibles de la siguiente forma:

help.search("geom_", package = "ggplot2")

 

Pongamos datos reales…

#Quitamos la basura
emision <- emision %>%
  filter(Nombre.Director != "NO INFORMADO")

 

Ordenamos y hacemos un sencillo resumen

emision_anual <- emision %>%
  group_by(Año.Contable) %>%
  summarise(Prima_E = sum(Emitida))
emision_anual
## # A tibble: 4 x 2
##   Año.Contable      Prima_E
##          <int>        <dbl>
## 1         2016 10827627985.
## 2         2017 12318125772.
## 3         2018 14202526793.
## 4         2019 10182639580.

 

Y graficamos

ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
  geom_point()

Agregamos leyendas en ambos ejes

ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
  geom_point() +
  scale_x_continuous(limits = c(2015, 2020))+
  ylab("Prima Emitida Acumulada")+
  xlab("Año contable")

Un poco mejor

ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
  geom_point(size= 6, alpha= .6) +
  scale_x_continuous(limits = c(2015.5, 2019.5))+
  ylab("Prima Emitida Acumulada")+
  xlab("Año contable")

O mejor asi

ggplot(emision_anual, aes(y = Prima_E, x = Año.Contable)) +
  geom_point(size= 6, alpha= .6) +
  geom_line(color= "red") +
  scale_x_continuous(limits = c(2015.5, 2019.5))+
  ylab("Prima Emitida Acumulada")+
  xlab("Año contable")

Sin embargo podemos hacer mejores visualizaciones con mejores datos…

 

Volvemos a ordenar el set original

emision_director <- emision %>%
  filter(Nombre.Director != "NO INFORMADO") %>%
  group_by(Nombre.Director, Año.Contable) %>%
  summarise(Prima_E = sum(Emitida),
            Prima_P = sum(Pagada))
emision_director
## # A tibble: 24 x 4
## # Groups:   Nombre.Director [6]
##    Nombre.Director Año.Contable     Prima_E     Prima_P
##    <chr>                  <int>       <dbl>       <dbl>
##  1 CHEMA                   2016 1276115429. 1261107000.
##  2 CHEMA                   2017 1399058109. 1351242103.
##  3 CHEMA                   2018 1585929111. 1581205688.
##  4 CHEMA                   2019 1016438189. 1063419001.
##  5 EL BAILADOR             2016 1503532561. 1426823176.
##  6 EL BAILADOR             2017 1631954516. 1545986628.
##  7 EL BAILADOR             2018 1874743990. 1832613076.
##  8 EL BAILADOR             2019 1634953994. 1285381085.
##  9 GEORGE W BUSH           2016  413164395.  332089523.
## 10 GEORGE W BUSH           2017  394549120.  390359735.
## # ... with 14 more rows

 

y ahora si toma sentido!!

ggplot(emision_director, aes(y = Prima_E, x = Año.Contable, colour = Nombre.Director)) +
  geom_point(size= 6, alpha= .7) +
  scale_x_continuous(limits = c(2015.5, 2019.5))+
  ylab("Prima Emitida Acumulada")+
  xlab("Año contable")

O mejor aun…se puede?

ggplot(emision_director, aes(x = Año.Contable, y = Nombre.Director)) +
  geom_point(aes(size = Prima_E), alpha = 0.4) +
  scale_size(range = c(0.5, 16))  #Ajusta el tamaño de los circulos

Podemos agregar algunas librerias que nos ayudan a mejorar las visualizaciones.

#install.packages("ggpubr")
library(ggpubr)
# Teniendo otros datos esta visualización es buenisima
ggscatterhist(
  emision_director, x = "Prima_E", y = "Prima_P",
  color = "Nombre.Director", size = 5, alpha = 0.7,
  margin.params = list(fill = "Nombre.Director", color = "black", size = 0.4)
  )

O podemos hacer algunas ya un poco conocidas…

ggplot(emision_director, aes(x = Año.Contable, y = Prima_E)) +
  geom_col(aes(color = Nombre.Director, fill = Nombre.Director), position = position_stack())

de mis favoritas

# Multiple line plot
ggplot(emision_director, aes(x = Año.Contable, y = Prima_E)) + 
  geom_line(aes(color = Nombre.Director), size = 1) +
  theme_minimal()

 

Le subimos el volumen!!!

#Obtenemos los datos de CHEM@
emi_chema <- emision %>%
  filter(Nombre.Director == "CHEMA",
         Año.Contable != "2019") %>%
  group_by(Nombre.Director, Año.Contable) %>%
  summarise(Prima_E = sum(Emitida),
            Prima_P = sum(Pagada))
#Una regresion lineal sencilla
#Obtenemos los coeficientes
regresion <- lm(Prima_E~Año.Contable, data = emi_chema)
#Ajustamos
emi_chema$prediccion <- predict(regresion)

#De mejor interpretación
p1 <- ggplot(emi_chema, aes(x = Año.Contable, y = Prima_E))

p1 + geom_point() +
  scale_x_continuous(limits = c(2016, 2018)) +
  geom_line(aes(y = prediccion))

Agregamos unas bandas de confianza representadas por una sombra

p1 + geom_point() +
  scale_x_continuous(limits = c(2016, 2018)) +
  geom_line(aes(y = prediccion)) +
  geom_smooth()

…pero y el año 2019 y el 2020 como va a cerrar? Ideas??

 

Seguimos con la magia!

conf1 <- predict(regresion,interval="confidence")
pred1 <- predict(regresion,interval="prediction")

Pasamos los siguientes dos años…

new <- data.frame(Año.Contable=seq(2019,2020,length=2))
conf2 <- predict(regresion,interval="confidence",newdata=new)
pred2 <- predict(regresion,interval="prediction",newdata=new)
new$prediccion <- predict(regresion,newdata=new)
new
##   Año.Contable prediccion
## 1         2019 1730181232
## 2         2020 1885088074

y lo graficamos para que se entienda mejor

emi_chema_pred <-bind_rows(emi_chema,new)
p2 <- ggplot(emi_chema_pred, aes(x = Año.Contable, y = Prima_E))
p2 + geom_point(size= 2) +
  scale_x_continuous(limits = c(2016, 2020)) +
  geom_line(aes(y = prediccion)) +
  geom_point(aes(y = prediccion),color= "blue", size= 3, alpha = 0.4) 

revisamos el detalle que nos da “lm”, las bandas de confianza y de predicción

par(las=1,bty="l") ## formato
plot(Prima_E~Año.Contable,data=emi_chema,ylim=c(120000000,2650000000),xlim=c(2016,2020)) ## datos originales
abline(regresion) ## ajuste del modelo
matlines(emi_chema$Año.Contable,conf1[,c("lwr","upr")],col=2,lty=1,type="b",pch="+")
matlines(emi_chema$Año.Contable,pred1[,c("lwr","upr")],col=2,lty=2,type="b",pch=1)
matlines(new$Año.Contable,conf2[,c("lwr","upr")],col=4,lty=1,type="b",pch="+")
matlines(new$Año.Contable,pred2[,c("lwr","upr")],col=4,lty=2,type="b",pch=1)

 

Mas ideas, revisen el siguiente link:

https://www.datanovia.com/en/blog/ggplot-examples-best-reference/

Buenisimos tutoriales, muchas gracias a los amigos de datanovia!!!

Ademas pueden revisar el documento de apoyo data-visualization-2.1.pdf que esta en el repo del Workshop.

 

R_Rmd

OBJETIVO: Crear, guardar, ejecutar codigo para generar un reporte

 

Antes de empezar con RMD´s revisaremos un par de temas importantes:

1. tidyr

Es tema muy importante para la manipulación y manejo de datos son formatos denominados tidy, es una abstracción de datos limpios, antes del concepto ya existian datos almacenados de esta forma, pero R nos brinda una serie de verbos ó funciones para convertirlos como queremos de una manera simple y sencilla.

Mas info revisen el siguiente artículo:

Asi los queremos:

Tidy Data

Tidy Data

Se acomoda cada variable en una columna

Cada observación en un renglón

Y cada valor en una celda ó casilla.

 

¿Cómo podemos encontrar la información almacenada en el mundo de los datos?

Aquí algunos ejemplos:

Observación con datos implícitos
Lat Long Indicador
Obs1 # # #
Con fecha implícita
lugar indicador
Obs 1
Obs 2
Otro con Fecha implícita
Fecha 1 Fecha 2
lugar 1
lugar 2
Uno más!!!
Fecha 1 Fecha 2
LUGAR 1
Ind 1 # #
Ind 2 # #
LUGAR 2
Ind 1 # #
Ind 2 # #

Tablas que también existen en otro tipo de formatos:

Indicador 1 Indicador 2
Fecha 1 Fecha 2 Fecha 1 Fecha 2
lugar 1 Ind 1 Ind 1 Ind 2 Ind 2
lugar 1 Ind 1 Ind 1 Ind 2 Ind 2

Otros ejemplos:

  • Nombres de las columnas representan valores de los datos en lugar de nombres de variables -el nombre de un lugar por ejemplo-
  • Una columna contiene varias variables en lugar de una variable
  • Una tabla contiene más de una unidad de observación
  • Las variables están contenidas en los renglones y columnas, en lugar de sólo columnas.
  • Los datos de una unidad observacional están dispersas en varios data sets

Usando tidyr se ve como sigue:

library(tidyr)
desordenados <- data_frame(nombre=c("juan.perez.lopez","martha.lopez.benitez",
                             "jesus.ramirez.perez","jose.martinez.lopez",
                             "aurora.saldivar.salazar"),
                    genero_edad=c("m.35","f.23","m.30","m.25","f.33"),
                    time=c(1,3,4,5,6))

desordenados
## # A tibble: 5 x 3
##   nombre                  genero_edad  time
##   <chr>                   <chr>       <dbl>
## 1 juan.perez.lopez        m.35            1
## 2 martha.lopez.benitez    f.23            3
## 3 jesus.ramirez.perez     m.30            4
## 4 jose.martinez.lopez     m.25            5
## 5 aurora.saldivar.salazar f.33            6

Tendríamos que dejarlo tidy:

  • Separando el nombre
medio.desordenados <- desordenados %>% separate(col=nombre, into=c("nombre",
                                      "apellido_paterno",
                                      "apellido_materno"), 
                   sep="\\.")

medio.desordenados
## # A tibble: 5 x 5
##   nombre apellido_paterno apellido_materno genero_edad  time
##   <chr>  <chr>            <chr>            <chr>       <dbl>
## 1 juan   perez            lopez            m.35            1
## 2 martha lopez            benitez          f.23            3
## 3 jesus  ramirez          perez            m.30            4
## 4 jose   martinez         lopez            m.25            5
## 5 aurora saldivar         salazar          f.33            6
  • Separando género y edad
limpios <- medio.desordenados %>% separate(col=genero_edad, into=c("genero","edad"), 
                   sep="\\.")

limpios
## # A tibble: 5 x 6
##   nombre apellido_paterno apellido_materno genero edad   time
##   <chr>  <chr>            <chr>            <chr>  <chr> <dbl>
## 1 juan   perez            lopez            m      35        1
## 2 martha lopez            benitez          f      23        3
## 3 jesus  ramirez          perez            m      30        4
## 4 jose   martinez         lopez            m      25        5
## 5 aurora saldivar         salazar          f      33        6

Otro ejemplo: ¿Qué está mal?

paises <- data_frame(pais=c(rep("Afganistan",4),
                           rep("Brazil",4),
                           rep("China",4)),
                    year=c(rep(1999,2),rep(2000,2),
                           rep(1999,2),rep(2000,2),
                           rep(1999,2),rep(2000,2)),
                    llave=c("casos","poblacion","casos","poblacion",
                          "casos","poblacion","casos","poblacion",
                          "casos","poblacion","casos","poblacion"),
                    valor=c(75,1300000,134,1400000,
                            10000,100000000,12000,120000000,
                            56000,150000000,60000,170000000))

paises
## # A tibble: 12 x 4
##    pais        year llave         valor
##    <chr>      <dbl> <chr>         <dbl>
##  1 Afganistan  1999 casos            75
##  2 Afganistan  1999 poblacion   1300000
##  3 Afganistan  2000 casos           134
##  4 Afganistan  2000 poblacion   1400000
##  5 Brazil      1999 casos         10000
##  6 Brazil      1999 poblacion 100000000
##  7 Brazil      2000 casos         12000
##  8 Brazil      2000 poblacion 120000000
##  9 China       1999 casos         56000
## 10 China       1999 poblacion 150000000
## 11 China       2000 casos         60000
## 12 China       2000 poblacion 170000000

Lo deberíamos arreglar con:

limpio <- paises %>% spread(key=llave, value=valor, fill=NA)

limpio
## # A tibble: 6 x 4
##   pais        year casos poblacion
##   <chr>      <dbl> <dbl>     <dbl>
## 1 Afganistan  1999    75   1300000
## 2 Afganistan  2000   134   1400000
## 3 Brazil      1999 10000 100000000
## 4 Brazil      2000 12000 120000000
## 5 China       1999 56000 150000000
## 6 China       2000 60000 170000000

El último

stocks <- data_frame(
  time = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)

stocks
## # A tibble: 10 x 4
##    time            X      Y      Z
##    <date>      <dbl>  <dbl>  <dbl>
##  1 2009-01-01 -0.199 -0.548 -0.674
##  2 2009-01-02  1.02  -2.43   0.253
##  3 2009-01-03  1.43   0.194  0.493
##  4 2009-01-04 -1.76  -3.58   1.00 
##  5 2009-01-05 -0.437  3.19   8.18 
##  6 2009-01-06  1.57   0.849 -6.98 
##  7 2009-01-07  0.722 -0.946  1.82 
##  8 2009-01-08  1.41   0.879  0.484
##  9 2009-01-09 -0.598 -1.73  -6.21 
## 10 2009-01-10 -0.189 -2.82  -0.450
stocks %>% gather(stock, price, -time)
## # A tibble: 30 x 3
##    time       stock  price
##    <date>     <chr>  <dbl>
##  1 2009-01-01 X     -0.199
##  2 2009-01-02 X      1.02 
##  3 2009-01-03 X      1.43 
##  4 2009-01-04 X     -1.76 
##  5 2009-01-05 X     -0.437
##  6 2009-01-06 X      1.57 
##  7 2009-01-07 X      0.722
##  8 2009-01-08 X      1.41 
##  9 2009-01-09 X     -0.598
## 10 2009-01-10 X     -0.189
## # ... with 20 more rows

 

2. Mutating Joins

Otro tema super util e importante son los joins, son una especie de validaciones de datos que cumplen las condiciones que nosotros indicamos para unir dos tablas o parte de ellas, los conocemos en excel como el famoso buscarv (horrenda comparación, pero es necesaria para efectos didacticos), los joins son mucho mas poderosos y se resume en lo siguiente:

 

Mutating Joins

Mutating Joins

 

Revisemos un excelente articulo, veamos la sintaxis, lo pueden replicar después para entender mejor.

https://rpubs.com/williamsurles/293454

 

RMD/R Markdown

La creación de documentos con Markdown R comienza con un archivo de extensión .Rmd, el cual contiene una combinación de markdown (contenido con formato de texto simple) y trozos de código R. El archivo .Rmd se alimenta a knitr, que ejecuta todos los trozos de código R y crea un nuevo documento de reducción (.md) que incluye el código R y su salida.

Ventajas respecto a otras herramientas de reportes:

  1. Tiene gran diversidad de formatos de salida, como html, pdf, bookdown, latex-pdf, slide, dashboard, folletos, entre otros.
  2. Reproducible
  3. Se puede ejecutar en tiempo real
  4. Excelente framework para ciencia de datos
  5. Se generan reportes de alta calidad que pueden ser compartidos en grandes audiencias

 

Iniciamos…

 

Sigan cuidadosamente las siguientes instrucciones, inicien RStudio y generen un nuevo proyecto:

  • En Windows click en el botón de Inicio y busquen Rstudio.
  • Ya en Rstudio den click en File -> New Project... -> Existing Directory -> Browse... -> seleccionar carpeta destino -> Open -> Create Project
  • En la consola instalen y habiliten lo siguiente:
install.packages("rmarkdown")
library(rmarkdown)
  • Despúes dar click en File -> New File -> R markdown
  • Poner en “title” el titulo del ejericio_1 y en “author” su nobre.
  • Guárdenlo en su carpeta del Proyecto nuevo que acabamos de crear. File -> Save As -> ruta a su carpeta y nombre del file.
  • Den click en el boton de Knit y veamos lo que pasa…

La forma de generar los documentos es la siguiente, veamos como es su estructura.

 

Iniciamos configurando el encabezado:

---
title: "Escribe tu titulo"
author: "Escribe tu nombre"
date: "Escribe la fecha"
output:
  pdf_document: default
  html_document: default
  word_document: default
---

 

Despúes ponemos un poco de texto en nuestro documento.

El texto normal se escribe igual que en cualquier otro documento, por ejemplo un documento word. Hay que tener cuidado si queremos escribir negritas, cursivas o algún carácter especial. Por ejemplo:

+ Negrita: Escribir el texto como **Negrita** o __Negrita__

+ Cursiva: Escribir el texto como *Cursiva* o _Cursiva_
  • Podemos poner encabezados por sección:
# Título 1
## Título 2
### Título 3

 

Luego insertamos el codigo de R en los famosos chunks de la siguiente forma:


```r
#Codigo
```

y por ultimo para obtener el documento final, simplemente damos click en el botón Knit y seleccionar Knit to HTML,PDF o WORD para producir un documento en el formato deseado.

 

Quieren saber mas, revisen las notas en el sitio oficial:

https://rmarkdown.rstudio.com/lesson-1.html

(Lo hacen en un rato libre, vale la pena!!!)

 

Ejercicio 2

  1. Generen un reporte con los datos del archivo ART_492, lean la base y seleccionen la información de su dirección (recuerden que esta por pestañas-sheets).

  2. Con dplyr hagan un resumen y desplieguenlo en el reporte.

  3. Hagan una gráfica de puntos o scatter plot con algo de información.

  4. Hagan una visualización como ustedes piensen que la base puede transmitir a cada ejecutivo su volumen de adeudos y lo que representa en $.

Den formato al reporte, usen titulos y describan brevemente cada sección de su reporte.

Todo lo anterior en un RMD con tus datos!

  • Lo envian por mail hasta el Lunes 2 de Septiembre a las 11:59:00 p.m.

 

Bonus

OBJETIVO: Mostrarles que aún hay mas cosas en el universo de R y generar mas ideas para sus proyectos.

 

A. Strings

Los strings son cualquier valor que se encuentre entre comillas ó comillas sencillas. A estos valores R los trata como strings, se almacenan entre comillas aunque en la UI solo se vean comillas sencillas.

a <- 'Empieza y termina con comilla sencilla'
a
## [1] "Empieza y termina con comilla sencilla"
b <- "Empieza y termina con comillas"
b
## [1] "Empieza y termina con comillas"
c <- "Comilla sencilla ' en medio de comillas"
c
## [1] "Comilla sencilla ' en medio de comillas"
d <- 'Comillas " en medio de comilla sencilla al inicio y al final'
d
## [1] "Comillas \" en medio de comilla sencilla al inicio y al final"

Ejemplo de strings invalidos:

e <- 'Comillas mezcladas" 
Resultado:
INCOMPLETE_STRING
f <- 'Una comilla sencilla ' dentro de otras comillas sencillas'
Resultado:
INCOMPLETE_STRING
g <- "Comillas " dentro de comillas dobles"
Resultado:
INCOMPLETE_STRING

Para concatenar strings usamos algo muy sencillo paste

a <- "D00"
b <- '1234'
c <- "2019 1"

print(paste(a,b,c))
## [1] "D00 1234 2019 1"
print(paste(a,b,c, sep = "-"))
## [1] "D00-1234-2019 1"
print(paste(a,b,c, sep = "", collapse = ""))
## [1] "D0012342019 1"

Para formatear los strings también usamos algo sencillo:

# Justificar a la Izquierda
cadena <- format("Cuota", width = 6, justify = "l")
cadena
## [1] "Cuota "
# Justificar al centro
cadena <- format("Cuota", width = 9, justify = "c")
cadena
## [1] "  Cuota  "

Podemos contar los caracteres de una oración con nchar()

cadena2 <- nchar("Prima Emitida en $ usd...")
cadena2
## [1] 25

Podemos cambiar a mayúsculas o minúsculas.

toupper(cadena)
## [1] "  CUOTA  "
tolower(cadena)
## [1] "  cuota  "

Por ultimo podemos hacer substrings más cortos de uno ya existente

# Extraer caracteres de la 5ta a la  7th posición
cadena3 <- substring("Ricardo Lastra", 5, 7)
cadena3
## [1] "rdo"

Adicional a R base pueden revisar la libreria stringr cuya sintaxis es muy amigable, esta dentro del universo Tidy que ya conocemos.

Pueden consultar el siguiente link https://cran.r-project.org/web/packages/stringr/vignettes/stringr.html

 

REGEX

Relacionado al tema, tambien revisen un buen tutorial de REGEX ó expresiones regulares, será de gran ayuda!!!

https://tutorialzine.com/2014/12/learn-regular-expressions-in-20-minutes

Herramienta para probar y depurar expresiones regulares.

https://regex101.com/

 

B. Fechas

Son de las cosas que más dolores de cabeza les dan a algunos, sin embargo hay librerías que lo hacen sencillo, las fechas son difíciles de manejar por los formatos en los que cada sistema las almacena, este no depende de los sistemas, sino de la necesidad del usuario, de la zona horaria, y en algunos casos son solo días, meses o horas con minutos y segundos los que se necesitan.

Una magnifica libreria es lubridate la cual soporta instantes, intervalos, duraciones y periodos.

fecha <- Sys.Date()
fechas <- seq(fecha, length.out=12, by = "1 month")
fechas
##  [1] "2019-09-04" "2019-10-04" "2019-11-04" "2019-12-04" "2020-01-04"
##  [6] "2020-02-04" "2020-03-04" "2020-04-04" "2020-05-04" "2020-06-04"
## [11] "2020-07-04" "2020-08-04"

más ejemplos…

Accedemos al formato dd/mm/aaaa con la funcion dmy y obtenemos el mes de la fecha de nacimiento:

library(lubridate)
bday <- dmy("29/05/1986")
month(bday)
## [1] 5

Accedemos al día de la semana de ese año:

wday(bday, label = TRUE)
## [1] jue\\.
## 7 Levels: dom\\. < lun\\. < mar\\. < mié\\. < jue\\. < ... < sáb\\.

Y accedemos también al dia del año actual:

year(bday) <- 2019
wday(bday, label = TRUE)
## [1] mié\\.
## 7 Levels: dom\\. < lun\\. < mar\\. < mié\\. < jue\\. < ... < sáb\\.

 

Y en formato aaaa/mm/dd hr:min:seg con la funcion ymd_hms y obtenemos el mes de la fecha de esta forma:

time <- ymd_hms("2019-06-25 15:30:30")
time
## [1] "2019-06-25 15:30:30 UTC"

Funciones de ayuda para manipular time zones: with_tz(), force_tz()

# Changes printing
with_tz(time, "America/Chicago")
## [1] "2019-06-25 10:30:30 CDT"
# Changes time
force_tz(time, "America/Chicago")
## [1] "2019-06-25 15:30:30 CDT"

 

C. Factores

Cuando uno quiere analizar datos, regularmente necesita variables que funcionan como etiquetas. Estas etiquetas pueden ser contadas, pero no sumadas. A este tipo de variables se les conoce como variables categóricas y en R se llaman factores.

mascotas <- c("P", "G", "P", "P", "G", "P")
mascotas <- factor(mascotas)
mascotas
## [1] P G P P G P
## Levels: G P
mascotas <- factor(c("P", "G", "P", "P", "G", "P","G"), levels=c("G", "P"), labels=c("GATO", "PERRO"))
mascotas
## [1] PERRO GATO  PERRO PERRO GATO  PERRO GATO 
## Levels: GATO PERRO

 

D. Paleta de colores

En el mundo visual, para tunnear nuestros graficos, la libreria “RColorBrewer” es una herramienta basica, contiene

#install.packages("RcolorBrewer")
library(RColorBrewer)
#create a sequential palette for usage and show colors
mypalette<-brewer.pal(7,"Greens")
image(1:7,1,as.matrix(1:7),col=mypalette,xlab="Tonos de Verde",
       ylab="",xaxt="n",yaxt="n",bty="n")

## display a qualitative palette
display.brewer.pal(7,"Accent")

Mas información en: https://www.rdocumentation.org/packages/RColorBrewer/versions/1.1-2/topics/RColorBrewer

E. Listas

Algo muy util en programación orientada a objetos son las listas, son parecidas a los vectores, pero con una diferencia importante: pueden tener los elementos de diferentes tipos.

lista <- list(1, 2, 3, 4, 5)
lista
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 4
## 
## [[5]]
## [1] 5

 

El operador de extracción ([), devuelve una lista

lista[1]
## [[1]]
## [1] 1
is.list(lista[1])
## [1] TRUE
is.vector(lista[1])
## [1] TRUE

 

El operador [[ devuelve un vector

lista[[1]]
## [1] 1
is.list(lista[[1]])
## [1] FALSE
is.vector(lista[[1]])
## [1] TRUE

 

Asi es como se ven los diferentes datos de

renta <- list(direccion="Masarik 306", m2=c(10, 15, 3), dlls.men=2500)
renta
## $direccion
## [1] "Masarik 306"
## 
## $m2
## [1] 10 15  3
## 
## $dlls.men
## [1] 2500

 

Existe otro operador de acceso: $ (lo vimos en sesiones pasadas también)

renta$dlls.men
## [1] 2500
renta[3]
## $dlls.men
## [1] 2500
renta[[2]]
## [1] 10 15  3

 

F. Mapas interactivos.

Para crear visualizaciones muy buenas a través de mapas, existe leaflet, la cual es una librería creada por los amigos de Rstudio para integrarla a la distribución del mismo nombre creada en JavaScript.

Es súper interesante este tema, ya que podemos generar mapas interactivos, integrarlos en una APP, publicarlos en línea o hasta ponerlos en nuestro reporte RMD.

Esencialmente el paquete te permite generar mapas con configuraciones personales de map tiles, markers, polygons, lines, popups, y objetos geojson. Casi todo lo que conocemos de Google Fusion Tables o Carto(DB) en esta parte de mapas, ustedes lo pueden hacer usando R y el paquete de leaflet.

Aquí un buen ejemplo!!!

#install.packages("leaflet")
library(leaflet)
# Initialize and assign m as the leaflet object
m <- leaflet() %>%
# Now add tiles to it
    addTiles() %>%  
# Setting the middle of where the map should be and the zoom level
    setView(lng=-77.030137, lat=38.902986, zoom = 16) %>%
# Now, add a marker with a popup, 
    addMarkers(lng=-77.030137, lat=38.902986, popup="<b>Hola Workshop</b><br><a href='https://www.washingtonpost.com'>-Link_a_sitio_relacionado_con_ubicación</a>")

m 

 

F. Intermedios-Avanzados R

i) Shiny
ii) Simulación
iii) Scrapping
iv) Algoritmos de ML
v) Algoritmos de Texto
vi) Creando un paquete
vii) Paralelo
viii) API´s

 

G. Otras herramientas

i) Git
ii) Spark & Keras
iii) SQLite, JS, C
iv) Docker
v) Bash programming, paralelo
vi) AWS (Amazon cloud services)

Muchas gracias!!!

 

Extra Bonus

Aquí lo prometido!!! Usenlo y diviertanse!!!!

 

Ejemplos de joins:

reporte_produccion <- left_join(produccion, agentes, by = "IDAGE")

En este ejemplo se tiene una base de producción al cierre en la variable produccion y en la variable agentes se tiene un catalogo de agentes (clave,razon social), se usa como indice para la union de las bases la variable IDAGE la cual esta contenida en ambas tablas y al hacer el left join se genera una columna nueva en la base original de producción.

Este es el uso mas simple de un join, pero el mas similar a un clasico cruce con buscarv de excel.

Otro ejemplo:

reporte_produccion <- left_join(produccion, meses, by = "FECONT")

En este ejemplo se tiene una base de producción al cierre en la variable produccion y en la variable meses se tiene un catalogo de meses (fechacon,mes_numerico,mes_letra), se usa como indice para la union de las bases la variable FECONT la cual esta contenida en ambas tablas y al hacer el left join se generan dos columnas nuevas en la base original de producción que contienen el mes numerico y el mes en texto.

Un ejemplo mas:

#CRUZAMOS POR LLAVE "ID_TRABAJADOR", "ID_CREDITO" 
VARIABLE_X <-DT5MIO %>% 
  semi_join(DT17MIO, by = c("ID_TRABAJADOR", "ID_CREDITO"))

En ese ejmplo se juntan dos tablas por un indice doble o dos llaves usando dplyr.

Por ultimo, y si la union se desea hacer con el nombre de los indices/llave diferentes?, si, también se puede!!!

#CRUCE POR ID_TRABAJADOR Y LA MISMA VARIABLE PERO CON OTRO NOMBRE
m=merge(DT4, DT2, by.x= c("ID_TRABAJADOR"), by.y = c("ALGUN_TRABAJADOR"), allow.cartesian=TRUE)

Lo anterior nos indica que podemos unir dos bases por la llave nombrada de diferente manera, pero con datos que sabemos que pueden coincidir. El merge nos ayuda a unir ambas bases en una sola.

 

Una función muy valiosa con un trimws:

produccion_sin_espacios <- data.frame(lapply(produccion, function(x) if(class(x)=="character") trimws(x) else(x)), stringsAsFactors=F)

La función evalua con lapply y el if los casos donde las entradas (columnas/variables) de una base completa sean tipo char y ejecuta un recorte de espacios, o los elimina mejor dicho con trimws y se guarda todo en una variable identica pero sin espacios al inicio o al final de las observaciones.

 

Forma para generar un archivo csv a partir de una variable:

write.csv(la_variable, "c:/ruta_de_tu_directorio_raiz/EMISION_ACTUAL.csv", row.names = F)

La opción de row.names=F evita que se generen numeros consecutivos en cada fila o row.

 

Para juntar 2 o mas tablas en una sola usando rbind.data.frame:

#Combinar bases o tablas
nueva_basesota <- rbind.data.frame(base1,base2,base3,base4, stringsAsFactors = FALSE, use.names=TRUE, fill=TRUE)

La forma de combinar dos tablas o más en una sola es con rbind.data.frame que nos permite juntar una tabla encima de la otra apartir de tablas con el mismo numero de columnas y mismo nombre de las mismas en 1 sola tabla, los encabezados no se repiten y solo permanece un encabezado para las 2 o más secciones que se junten. Tambien existe de forma similar un cbind.data.frame que junta de forma similar columnas, aunque no es muy util ya que deseamos muchas veces hacer esto a través de Joins.

 

Una super función que remplaza los espacios y los puntos por guiones bajos:

clean_names<-function(x){
  #x<-str_replace_all(x,'.','_') 
  x<-str_replace_all(x,' ','_') 
}

La función anterior remplaza de un df determinado una serie de caracteres indicados por otros diferentes.

 

Super función para obtener un GEDA (graphic exploratory data analysis) automático:

#funcion que pide d.-dataframe, k.-numero de columnas que es el target i.e. clase
geda<-function(d,k){
  
  for(i in 1:ncol(d)){
    
  if(i!=k){
    
  if((class(pull(d[,i])))=="character"){
    print(i)
    
    p<-select(d,aux=noquote(colnames(d[i])),target=noquote(colnames(d[k])))%>%
      ggplot(aes(y=..count../sum(..count..),x=aux,fill=target))+geom_bar()+
      ggtitle(paste0('target=',noquote(colnames(d[k]))))+ylab('percentage')+xlab(noquote(colnames(d[i])))+
      theme(plot.title = element_text(hjust = 0.5))
  }
  else{
    p<-select(d,aux=noquote(colnames(d[i])),target=noquote(colnames(d[k])))%>%
      ggplot(aes(y=aux,x=target))+geom_boxplot()+ggtitle(noquote(colnames(d[i])))+
      ylab(noquote(colnames(d[i])))+xlab(noquote(colnames(d[k])))+
      theme(plot.title = element_text(hjust = 0.5))
    
  }
    print(p)
  }
    
  }
  
}

La función anterior es un ejemplo de un for loop y un if anidados que evaluan valores de una tabla haciendo las graficas correspondientes.

 

Un MEGA ejemplo de como usar dplyr y sus verbos, kable y sus multiples opciones y ggplot en una super grafica:

datos6 <- datos6 %>%
  mutate(Porcentaje.Crecimiento.Prima=((Primas.Netas.Emitidas/lag(Primas.Netas.Emitidas,1))-1)*100)%>% filter(Año.Contable>2012) %>%
  mutate(Año.Contable=as.character(Año.Contable)) %>%
  mutate("Crecimiento.Prima (%)" = sprintf("%0.2f", Porcentaje.Crecimiento.Prima))%>%
  select(-Porcentaje.Crecimiento.Prima) %>%
  mutate("Siniestralidad (%)" = sprintf("%0.2f", Siniestralidad))%>%
  select(-Siniestralidad)

kable(datos6,  format.args = list(decimal.mark = '.', big.mark = ","), linesep = "", align = "c", booktabs = T) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "responsive"), full_width = F, position = "left") %>% 
  add_footnote(c("Fuente: Departamento de Contabilidad."))
  
ggplot(data=datos6,
             aes(x=Año.Contable, y=Primas.Netas.Emitidas,group=1, text=paste0("Siniestralidad(%)=",Siniestralidad, "\n")))+
geom_line(colour="blue")+ geom_point(size = 2, colour="red") + 
scale_y_continuous(limits = c(1, 200000),label=comma,expand=c(0,0))+ 
scale_x_continuous(breaks = seq(from = 2013, to = 2018, by = 1),limits = c(2013, 2018))+
ylab("Prima Emitida")+
xlab("Año")+
theme(plot.margin = unit(c(1,.5,.5,1), "cm"))

En el ejemplo anterior hacemos con dplyr un breve resumen, mismo que visualizamos con kable en una tabla muy visual y posteriormente lo graficamos con ggplot en una super visualización con mucho detalle, la base original es de emisión histórica.

 

El siguiente ejemplo es similar a los resumenes que relizamos en sesiones atras usando dplyr:

#Tabla de Primas por direccion 
tabla5 <-  tabla4 %>%
  mutate(Año.Contable=as.character(Año.Contable)) %>%
  mutate(Emitida=as.numeric(Emitida)) %>%
  group_by(Año.Contable,Nombre.Director) %>%
  summarise(Emitida = sum(Emitida,na.rm=T)) %>%
  mutate(Ratio = (round((Emitida/sum(Emitida))*100,2))) #Generamos Ratio de % de primas por cada direccion

Nos brinda un resumen de las primas emitidas por director por año contable.

 

Ejemplos de una grafica muy nice con ggplotly:

  ######################## GRAFICA NICE ##################
#install.packages("plotly")
library(plotly)

p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
   geom_point() + geom_smooth()

p <- p %>%
  ggplotly(layerData = 2, originalData = F) %>%
  add_fun(function(p) {
    p %>% slice(which.max(se)) %>%
      add_segments(x = ~x, xend = ~x, y = ~ymin, yend = ~ymax) %>%
      add_annotations("Maximum uncertainty", ax = 60)
  }) %>%
  add_fun(function(p) {
    p %>% slice(which.min(se)) %>%
      add_segments(x = ~x, xend = ~x, y = ~ymin, yend = ~ymax) %>%
      add_annotations("Minimum uncertainty")
  })

p

La funcion de ggplotly que proviene de la libreria de plotly nos ayuda a generar visualizaciones mas interactivas, es decir que podemos crear un ambiente entre la UI, el teclado y mouse o cualquier otro controlador directo a nuestro reporte.

Mas información en:

https://plot.ly/ggplot2/extending-ggplotly/

Muchas gracias!

 

A work by Ricardo Lastra

ricardolcuevas@gmail.com